package com.netty.netNio;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Scanner;

/**
 * nio
 */
public class nioClient {

    public void start(String clientName) throws IOException {
        /**
         * 1，链接服务端
         * 2，向服务器端发送数据。
         * 3，接收服务器端数据。
         */

        /**
         * 链接服务器端
         */
        SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8001));
//        socketChannel.bind(new InetSocketAddress("localhost",8001));

        /**
         *
         * 接收服务器端数据：
         *
         * 注意：链接服务器的之后,接收服务器数据代码，要在发送服务器数据代码之前，否则接收不到服务器端发送过的的数据，因为下面我使用的是
         * scanner是阻塞方法。
         *
         * 接收服务器端的数据
         *  首先创建selector，channel，注册channel到selector。和服务器端接收客户端数据是一样的
         *  逻辑
         *  现在我们使用一个线程接收服务器发送过来的数据。
         */
        Selector selector = Selector.open();
        socketChannel.configureBlocking(false);
        socketChannel.register(selector, SelectionKey.OP_READ);
        /**
         * 创建一个线程，作为接收服务器端数据的线程。
         */
        new Thread(new nioClientAccept(selector)).start();


        /**
         *  向服务器端发送数据
         */
        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNextLine()){
            String str = scanner.nextLine();
            if (str.length() > 0){
                socketChannel.write(Charset.forName("UTF-8").encode(clientName+":"+str));
            }
        }
    }

    public static void main(String[] args) throws IOException {
        nioClient nioClient = new nioClient();
        String cl = "客户端C";
        nioClient.start(cl);
        // 这一行不会被执行
        System.out.println("客户端启动成功");
    }
}
